package com.tedu.show;

import java.awt.event.KeyListener;

import javax.swing.JFrame;
import javax.swing.JPanel;

/**
 * @说明 游戏窗体
 * @功能说明 需要嵌入面板, 启动主线程等等
 */
public class GameJFrame extends JFrame {
    private JPanel jPanel = null; // 当前显示的面板
    private Thread thead = null;  // 游戏主线程
    private Thread panelRepaintThread = null;   // 用于管理面板的刷新线程

    public GameJFrame() {
        init();
    }

    public void init() {
        this.setSize(GameConstants.WINDOW_WIDTH, GameConstants.WINDOW_HEIGHT); //设置窗体大小
        this.setTitle("泡泡堂");
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);    //设置退出并且关闭
        this.setLocationRelativeTo(null);   //屏幕居中显示
        this.setFocusable(true);    // 设置窗体可获取焦点
        this.setResizable(false);   // 不允许调整窗口大小
    }

    /**
     * 更新窗口大小和可缩放状态
     * @param width 新的宽度
     * @param height 新的高度
     * @param resizable 是否允许用户调整大小
     */
    public void updateSize(int width, int height, boolean resizable) {
        this.setResizable(resizable);
        this.setSize(width, height);
        // 调整大小后重新居中
        this.setLocationRelativeTo(null);
    }

    /**
     * 设置并切换当前显示的面板
     */
    public void setjPanel(JPanel jPanel) {
        if (this.panelRepaintThread != null && this.panelRepaintThread.isAlive()) {
            this.panelRepaintThread.interrupt();
        }

        if (this.jPanel != null) {
            this.remove(this.jPanel);
        }
        this.jPanel = jPanel;
        this.add(jPanel);

        if (this.jPanel instanceof Runnable) {
            // 如果是，则为它创建一个新线程并启动，用于执行repaint循环
            this.panelRepaintThread = new Thread((Runnable) this.jPanel);
            this.panelRepaintThread.start();
        }
        // 刷新UI以显示新面板
        this.revalidate();
        this.repaint();
        // 为面板请求焦点，以确保键盘监听生效
        this.requestFocusInWindow();
    }

    /**
     * 设置游戏主线程
     */
    public void setThead(Thread thead) {
        if (this.thead != null && this.thead.isAlive()) {
            this.thead.interrupt();
        }
        this.thead = thead;
        if (this.thead != null) {
            this.thead.start();
        }
    }

    /**
     * 重写 addKeyListener 来确保只有一个监听器
     */
    @Override
    public synchronized void addKeyListener(KeyListener l) {
        for (KeyListener listener : this.getKeyListeners()) {
            this.removeKeyListener(listener);
        }
        super.addKeyListener(l);
    }
}





